package Modelo;

import Utils.Ficheros.FicheroDatos;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Vector;
import javax.swing.DefaultListModel;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;

/**
 *
 * @author Doria
 */
public class ListadoPOI {

    //Vector de archivos con POI disponibles
    private Vector<ElementoPOI> listaPOI;
    private Vector listaTipos;

    public ListadoPOI() {
        listaPOI = new Vector();
        listaTipos = new Vector();
    }

    public boolean addPOI(ElementoPOI poi) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (poi.getNombre().equals(elem.getNombre())) {
                encontrado = true;
            }
            i++;
        }
        if (!encontrado) {
            listaPOI.addElement(poi);
            return true;
        }
        return false;
    }

    public void removePOI(String nom) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (nom.equals(elem.getNombre())) {
                listaPOI.removeElementAt(i);
                encontrado = true;
            }
            i++;
        }
    }

    public void addTipo(String tipo) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaTipos.size()) {
            if (tipo.equals(listaTipos.get(i))) {
                encontrado = true;
            }
            i++;
        }
        if (!encontrado) {
            listaTipos.addElement(tipo);
        }

    }

    public void removeTipo(String tipo) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaTipos.size()) {
            if (tipo.equals(listaTipos.get(i))) {
                listaTipos.removeElementAt(i);
                encontrado = true;
            }
            i++;
        }
    }

    public boolean cargarPOI(DefaultListModel modelListPOI) throws FileNotFoundException {
        String nombreRuta = "";
        JFileChooser dialogCargar = new JFileChooser();
        dialogCargar.setAcceptAllFileFilterUsed(false);
        FileNameExtensionFilter filterPoi = new FileNameExtensionFilter("*.poi", "poi");
        FileNameExtensionFilter filterCsv = new FileNameExtensionFilter("*.csv", "csv");
        dialogCargar.setDialogTitle("Cargar POI");
        dialogCargar.addChoosableFileFilter(filterPoi);
        dialogCargar.addChoosableFileFilter(filterCsv);
        dialogCargar.setFileFilter(filterPoi);
        int seleccion = dialogCargar.showOpenDialog(null);
        if (seleccion == dialogCargar.APPROVE_OPTION) {
            nombreRuta = dialogCargar.getSelectedFile().getPath();
        }
        FileInputStream inputStreamTxt = null;
        if (nombreRuta.compareTo("") != 0) {
            File rutaMapa = new File(nombreRuta);
            inputStreamTxt = new FileInputStream(rutaMapa);
            String extension = (dialogCargar.getFileFilter().getDescription()).substring(2);
            if (extension.equals("poi")) {
                ElementoPOI elem = lecturaFicheroPOI(inputStreamTxt);
                while ((elem.getLatitud() != -1) && (elem.getLongitud() != -1)) {
                    if (addPOI(elem)) {
                        modelListPOI.addElement(elem.getNombre());
                    }
                    elem = lecturaFicheroPOI(inputStreamTxt);
                }
            } else {
                ElementoPOI elem = lecturaFicheroCSV(inputStreamTxt);
                while ((elem.getLatitud() != -1) && (elem.getLongitud() != -1)) {
                    if (addPOI(elem)) {
                        modelListPOI.addElement(elem.getNombre());
                    }
                    elem = lecturaFicheroCSV(inputStreamTxt);
                }
            }

            try {
                inputStreamTxt.close();
                return true;
            } catch (IOException ex) {
                ex.printStackTrace();
                return false;
            }
        }
        return false;
    }

    public ElementoPOI lecturaFicheroPOI(InputStream log) {
        String nombre = "";
        String descripcion = "";
        String tipo = "";
        double latitud = -1;
        double longitud = -1;

        try {
            StringBuffer buffer = new StringBuffer();
            int c = log.read();
            if (c != -1) {
                char ch = (char) c;
                //Quito espacios
                while (c == ' ') {
                    c = log.read();
                    ch = (char) c;
                }
                //Leo la longitud
                while (c != ',') {
                    buffer.append(ch);
                    c = log.read();
                    ch = (char) c;
                }
                c = log.read();
                ch = (char) c;
                longitud = Double.valueOf(buffer.toString()).doubleValue();
                buffer.delete(0, buffer.length());

                //Quito espacios
                while (c == ' ') {
                    c = log.read();
                    ch = (char) c;
                }
                //Leo la latitud
                while (c != ',') {
                    buffer.append(ch);
                    c = log.read();
                    ch = (char) c;
                }
                c = log.read();
                ch = (char) c;
                latitud = Double.valueOf(buffer.toString()).doubleValue();
                buffer.delete(0, buffer.length());

                //Quito espacios
                while (c == ' ') {
                    c = log.read();
                    ch = (char) c;
                }
                c = log.read(); //Para las "
                ch = (char) c;
                //Leo el nombre
                while (c != '"') {
                    buffer.append(ch);
                    c = log.read();
                    ch = (char) c;
                }
                c = log.read(); //Para las "
                ch = (char) c;
                c = log.read(); //para la ,
                ch = (char) c;
                nombre = buffer.toString();
                buffer.delete(0, buffer.length());

                //Quito espacios
                while (c == ' ') {
                    c = log.read();
                    ch = (char) c;
                }
                c = log.read(); //Para las "
                ch = (char) c;
                //Leo la descripcion
                while (c != '"') {
                    buffer.append(ch);
                    c = log.read();
                    ch = (char) c;
                }
                c = log.read(); //Para las "
                ch = (char) c;
                c = log.read(); //Para la ,
                ch = (char) c;
                descripcion = buffer.toString();
                buffer.delete(0, buffer.length());

                //Quito espacios
                while (c == ' ') {
                    c = log.read();
                    ch = (char) c;
                }
                c = log.read(); //Para las "
                ch = (char) c;
                //Leo el tipo
                while (c != '"') {
                    buffer.append(ch);
                    c = log.read();
                    ch = (char) c;
                }
                c = log.read(); //Para las "
                ch = (char) c;
                tipo = buffer.toString();
                buffer.delete(0, buffer.length());
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        int[] pixelXY = CalculosDatos.calcular(new FicheroDatos(latitud, longitud));
        return (new ElementoPOI(false, nombre, descripcion, tipo, latitud, longitud, pixelXY[2], pixelXY[3]));
    }

    public ElementoPOI lecturaFicheroCSV(InputStream log) {
        String nombre = "NotFound";
        String descripcion = "";
        String tipo = "Otro";
        double latitud = -1;
        double longitud = -1;

        try {
            StringBuffer buffer = new StringBuffer();
            int c = log.read();
            if (c != -1) {
                char ch = (char) c;
                //Quito espacios
                while (c == ' ') {
                    c = log.read();
                    ch = (char) c;
                }
                //Salto la primera linea si tiene texto
                while (c != '-' && c != '0' && c != '1' && c != '2' && c != '3' && c != '4' && c != '5' && c != '6' && c != '7' && c != '8' && c != '9') {
                    c = log.read();
                    ch = (char) c;
                }

                //Quito espacios
                while (c == ' ') {
                    c = log.read();
                    ch = (char) c;
                }
                //Leo la longitud
                while (c != ',') {
                    //Quito espacios
                    if (c == ' ') {
                        while (c == ' ') {
                            c = log.read();
                            ch = (char) c;
                        }
                    } else {
                        buffer.append(ch);
                        c = log.read();
                        ch = (char) c;
                    }
                }
                c = log.read();
                ch = (char) c;
                longitud = Double.valueOf(buffer.toString()).doubleValue();
                buffer.delete(0, buffer.length());

                //Quito espacios
                while (c == ' ') {
                    c = log.read();
                    ch = (char) c;
                }
                //Leo la latitud
                while (c != ',') {
                    //Quito espacios
                    if (c == ' ') {
                        while (c == ' ') {
                            c = log.read();
                            ch = (char) c;
                        }
                    } else {
                        buffer.append(ch);
                        c = log.read();
                        ch = (char) c;
                    }
                }
                c = log.read();
                ch = (char) c;
                latitud = Double.valueOf(buffer.toString()).doubleValue();
                buffer.delete(0, buffer.length());

                //Quito espacios
                while (c == ' ') {
                    c = log.read();
                    ch = (char) c;
                }
                c = log.read(); //Para las "
                ch = (char) c;
                //Leo el nombre
                while (c != '"') {
                    buffer.append(ch);
                    c = log.read();
                    ch = (char) c;
                }
                c = log.read(); //Para las "
                ch = (char) c;
                nombre = buffer.toString();
                buffer.delete(0, buffer.length());
                while (ch != '\n') {
                    c = log.read();
                    ch = (char) c;
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        int[] pixelXY = CalculosDatos.calcular(new FicheroDatos(latitud, longitud));
        return (new ElementoPOI(false, nombre, descripcion, tipo, latitud, longitud, pixelXY[2], pixelXY[3]));
    }

    public void guardarPOI() {
        try {

            JFileChooser dialogGuardar = new JFileChooser();
            FileNameExtensionFilter filterPoi = new FileNameExtensionFilter("*.poi", "poi");
            FileNameExtensionFilter filterCsv = new FileNameExtensionFilter("*.csv", "csv");
            dialogGuardar.setDialogTitle("Guardar POI");
            dialogGuardar.addChoosableFileFilter(filterCsv);
            dialogGuardar.addChoosableFileFilter(filterPoi);
            dialogGuardar.setFileFilter(filterPoi);
            dialogGuardar.setAcceptAllFileFilterUsed(false);
            String nombreRuta = "";
            int seleccion = dialogGuardar.showSaveDialog(null);
            if (seleccion == dialogGuardar.APPROVE_OPTION) {
                nombreRuta = dialogGuardar.getSelectedFile().getPath();
            }

            String extension = (dialogGuardar.getFileFilter().getDescription()).substring(2);
            if (extension.equals("poi")) {
                nombreRuta = nombreRuta + ".poi";
                // Quitar los .poi.poi..
                while (nombreRuta.endsWith(".poi.poi")) {
                    nombreRuta = nombreRuta.substring(0, nombreRuta.length() - 4);
                }
            } else {
                nombreRuta = nombreRuta + ".csv";
                // Quitar los .csv.csv..
                while (nombreRuta.endsWith(".csv.csv")) {
                    nombreRuta = nombreRuta.substring(0, nombreRuta.length() - 4);
                }
            }
            File rutaGrabada = new File(nombreRuta);
            rutaGrabada.createNewFile();
            FileOutputStream buffer = new FileOutputStream(rutaGrabada);
            String temp = "";
            for (int i = 0; i < listaPOI.size(); i++) {
                ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
                String nombre = elem.getNombre();
                String desc = elem.getDescripcion();
                String tipo = elem.getTipo();
                double latitud = elem.getLatitud();
                double longitud = elem.getLongitud();
                if (rutaGrabada.getName().endsWith("poi")) {
                    temp +=
                            longitud + ", " +
                            latitud + ", " +
                            '"' + nombre + '"' + ", " +
                            '"' + desc + '"' + ", " +
                            '"' + tipo + '"' + '\n';
                } else {
                    temp +=
                            longitud + ", " +
                            latitud + ", " +
                            '"' + nombre + '"' + '\n';
                }

            }
            buffer.write(temp.getBytes());
            buffer.flush();
            buffer.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

    public Vector getListaPOI() {
        return listaPOI;
    }

    public Vector getListaTipos() {
        return listaTipos;
    }

    public String dameDescripcion(String nombre) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (elem.getNombre().equals(nombre)) {
                return elem.getDescripcion();
            }

            i++;
        }

        return "";
    }

    public double[] dameLatLon(String nombre) {
        boolean encontrado = false;
        int i = 0;
        double[] aux = new double[2];
        aux[0] = -1;
        aux[1] = -1;
        while (!encontrado && i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (elem.getNombre().equals(nombre)) {
                aux[0] = elem.getLatitud();
                aux[1] = elem.getLongitud();
                return aux;
            }

            i++;
        }

        return aux;
    }

    public String dameTipo(String nombre) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (elem.getNombre().equals(nombre)) {
                return elem.getTipo();
            }

            i++;
        }

        return "";
    }

    public void setDescripcion(String nombre, String text) {
        boolean encontrado = false;
        int i = 0;
        while (!encontrado && i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (elem.getNombre().equals(nombre)) {
                elem.setDescripcion(text);
            }

            i++;
        }
    }

    public double dameLatitudPoi(String nombre) {
        boolean encontrado = false;
        double lat = -1;
        int i = 0;
        while (!encontrado && i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (elem.getNombre().equals(nombre)) {
                lat = elem.getLatitud();
            }
            i++;
        }
        return lat;
    }

    public double dameLongitudPoi(String nombre) {
        boolean encontrado = false;
        double longi = -1;
        int i = 0;
        while (!encontrado && i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (elem.getNombre().equals(nombre)) {
                longi = elem.getLongitud();
            }
            i++;
        }
        return longi;

    }

    public void setSeleccionado(String nombre) {
        int i = 0;
        while (i < listaPOI.size()) {
            ElementoPOI elem = (ElementoPOI) listaPOI.elementAt(i);
            if (elem.getNombre().equals(nombre)) {
                elem.setSeleccionado(true);
            } else {
                elem.setSeleccionado(false);
            }
            i++;
        }
    }
}
